package com.ybwh.springboot2.conf;

import com.xfvape.uid.UidGenerator;
import com.xfvape.uid.impl.CachedUidGenerator;
import com.xfvape.uid.worker.DisposableWorkerIdAssigner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UidGeneratorConfig {

    /**
     * delta seconds  : 8.7年 * 8    接近70年
     */
    @Value(value = "${baidu-uid.time-bits:31}")
    protected int timeBits;
    /**
     * worker id  : 420万 / 8    超过50万次
     */
    @Value(value = "${baidu-uid.worker-bits:19}")
    protected int workerBits;
    /**
     * sequence: 支持qps最大为8192个
     */
    @Value(value = "${baidu-uid.seq-bits:13}")
    protected int seqBits;
    /**
     * 默认2016-05-20不配置的话，会浪费好几年的可用时间
     */
    @Value(value = "${baidu-uid.epoch-str:2024-05-20}")
    protected String epochStr;

    @Bean("disposableWorkerIdAssigner")
    public DisposableWorkerIdAssigner disposableWorkerIdAssigner() {
        DisposableWorkerIdAssigner disposableWorkerIdAssigner = new DisposableWorkerIdAssigner();
        return disposableWorkerIdAssigner;
    }

    @Bean("cachedUidGenerator")
    public UidGenerator uidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner) {
        CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
        /**
         * 默认配置说明：
         * 1）sign(1bit)：固定1bit符号标识，即生成的UID为正数。
         * 2）delta seconds (28 bits)：当前时间，相对于时间基点"2016-05-20"的增量值，单位：秒，最多可支持约8.7年（注意：(a)这里的单位是秒，而不是毫秒！ (b)注意这里的用词，是“最多”可支持8.7年，为什么是“最多”，后面会讲）。
         * 3）worker id (22 bits)：机器id，最多可支持约420w次机器启动。内置实现为在启动时由数据库分配，默认分配策略为用后即弃，后续可提供复用策略。
         * 4）sequence (13 bits)：每秒下的并发序列，13 bits可支持每秒8192个并发（注意下这个地方，默认支持qps最大为8192个）。
         */
        // 时间戳位数
        cachedUidGenerator.setTimeBits(timeBits);
        // 机器位数
        cachedUidGenerator.setWorkerBits(workerBits);
        // 每毫秒生成序号位数
        cachedUidGenerator.setSeqBits(seqBits);
        //从初始化时间起 默认"2016-05-20"
        cachedUidGenerator.setEpochStr(epochStr);

        cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner);


        return cachedUidGenerator;
    }
}